package project.documents.dao;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import project.documents.dao.Data;
import project.documents.dao.DbRemote;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DocumentDao {
    public void showDebug(String msg){
        System.out.println("["+(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())+"][documents/dao/Db]"+msg);
    }

            /*添加记录*/
    public void addFileInfRecord(Data data, JSONObject json) throws JSONException, SQLException {
       // String limitTime=data.getParam().has("limit_time")?data.getParam().getString("limit_time"):null;
        // 唯一标识符，作为文件的标准化命名的格式
        String unique_identity=(new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());
        String objectId="FileUpload_"+unique_identity;				//传到前端的本次上传的唯一流水号
        // 增添文件时后台主动添加时间
        String AddTime=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
        //构造sql语句，根据传递过来的条件参数
        String fileTitle=data.getParam().has("title")?data.getParam().getString("title"):null;
        String fileType=data.getParam().has("type")?data.getParam().getString("type"):null;
        String creatorId=data.getParam().has("create_user_id")?data.getParam().getString("create_user_id"):"00000000";
        String fileCreator=data.getParam().has("create_user")?data.getParam().getString("create_user"):"系统管理员";
        // 在上传文件时就给你一个固定的流水命名，然后再次根据文件类型进行命名，可以自由更改
        String standardFilename=data.getParam().has("standard_file_name")?data.getParam().getString("standard_file_name"):null;

        if(fileTitle!=null){
            String sql="insert into xm05_file_static(title,create_user,create_time,object_id,create_user_id,type,standardized_title)";
            sql=sql+" values('"+fileTitle+"'";
            sql=sql+",'"+fileCreator+"'";
            sql=sql+",'"+AddTime+"'";
            sql=sql+",'"+objectId+"'";
            sql=sql+",'"+creatorId+"'";
            sql=sql+",'"+fileType+"'";
            sql=sql+" ,'"+standardFilename+"')";
            data.getParam().put("sql",sql);
            updateRecord(data,json);
            //如果有附件，就更新附件
            String str=data.getParam().getString("attachment_ids");
            showDebug("[addFileInfRecord]整理之前的str="+str);
          //  str=str.substring(1,str.length()-1);		//去掉前后的[]，传输过来的例如：["ATTACH_20211112111539","ATTACH_20211112111543"]
            showDebug("[addFileInfRecord]str="+str);
            List<String> list = Arrays.asList(str.split(","));
            for (int i = 0; i < list.size(); i++) {
                String attachmentId = list.get(i);
                attachmentId=attachmentId.replaceAll("\"","");	//把里头的双引号去掉
                sql = "update xm05_file_attachment set parent_id='" + objectId + "' where object_id='" + attachmentId + "'";
                data.getParam().put("sql",sql);
                updateRecord(data,json);
            }
        }
    }
    /*删除记录*/
    public void deleteFileRecord(Data data, JSONObject json) throws JSONException, SQLException{
        //构造sql语句，根据传递过来的条件参数
        String id=data.getParam().has("id")?data.getParam().getString("id"):null;
        if(id!=null){
            String sql="delete from xm05_file_static where id="+data.getParam().getString("id");
            data.getParam().put("sql",sql);
            updateRecord(data,json);
        }
    }
    /*修改记录*/
    public void modifyFileRecord(Data data, JSONObject json) throws JSONException, SQLException{
        // 修改文件需要把修改时间给换掉
        String modifyTime=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
        //构造sql语句，根据传递过来的条件参数
        String id=data.getParam().has("id")?data.getParam().getString("id"):null;
        String fileTitle=data.getParam().has("title")?data.getParam().getString("title"):null;
        String fileCreator=data.getParam().has("modify_user")?data.getParam().getString("modify_user"):null;
        String fileType=data.getParam().has("type")?data.getParam().getString("type"):null;
        if(id!=null){
            String sql="update xm05_file_static";
            sql=sql+" set title='"+fileTitle+"'";
            sql=sql+" ,modify_user='"+fileCreator+"'";
            sql=sql+" ,type='"+fileType+"'";
            sql=sql+" ,modify_time='"+modifyTime+"'";
            sql=sql+" where id="+id;
            data.getParam().put("sql",sql);
            updateRecord(data,json);
        }
    }
    /*查询记录*/
    public void getFileRecord(Data data, JSONObject json) throws JSONException, SQLException{
        //构造sql语句，根据传递过来的查询条件参数
        String sql=createGetRecordSql(data);			//构造sql语句，根据传递过来的查询条件参数
        data.getParam().put("sql",sql);
        queryRecord(data,json);
    }

    /*查询指定记录*/
    public void queryFileInfRecord(Data data, JSONObject json) throws JSONException, SQLException{
        //构造sql语句，根据传递过来的条件参数
        String content=data.getParam().has("content")?data.getParam().getString("content"):null;
        if(content!=null){
            String sql="select * from xm05_file_static where "+data.getParam().getString("id");
            data.getParam().put("sql",sql);
            updateRecord(data,json);
        }
    }
    /*
     * 这是一个样板的函数，可以拷贝做修改用
     */
    private void updateRecord(Data data, JSONObject json) throws JSONException, SQLException{
        /*--------------------获取变量 开始--------------------*/
        JSONObject param=data.getParam();
        int resultCode=0;
        String resultMsg="ok";
        /*--------------------获取变量 完毕--------------------*/
        /*--------------------数据操作 开始--------------------*/
        project.weather.dao.DbRemote updateDb = new project.weather.dao.DbRemote("yjykfsj2021");
        String sql=data.getParam().getString("sql");
        showDebug("[updateRecord]"+sql);
        updateDb.executeUpdate(sql);
        updateDb.close();
        /*--------------------数据操作 结束--------------------*/
        /*--------------------返回数据 开始--------------------*/
        json.put("result_msg",resultMsg);															//如果发生错误就设置成"error"等
        json.put("result_code",resultCode);														//返回0表示正常，不等于0就表示有错误产生，错误代码
        /*--------------------返回数据 结束--------------------*/
    }
    private void queryRecord(Data data, JSONObject json) throws JSONException, SQLException{
        /*--------------------获取变量 开始--------------------*/
        String resultMsg = "ok";
        int resultCode = 0;
        List jsonList = new ArrayList();
        List jsonName = new ArrayList();
        /*--------------------获取变量 完毕--------------------*/
        /*--------------------数据操作 开始--------------------*/
        project.weather.dao.DbRemote queryDb = new project.weather.dao.DbRemote("yjykfsj2021");
        String sql=data.getParam().getString("sql");
        showDebug("[queryRecord]构造的SQL语句是：" + sql);
        try {
            ResultSet rs = queryDb.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
            int fieldCount = rsmd.getColumnCount();
            while (rs.next()) {
                Map map = new HashMap();
                for (int i = 0; i < fieldCount; i++) {
                    map.put(rsmd.getColumnName(i + 1), rs.getString(rsmd.getColumnName(i + 1)));
                }
                jsonList.add(map);
            }
            rs.close();
            // 为了返回excel，需要添加表头信息
            for(int i=0;i<fieldCount;i++)
            {
                String columnlabel = rsmd.getColumnLabel(i+1);
                jsonName.add(columnlabel);
            }
        } catch (Exception e) {
            e.printStackTrace();
            showDebug("[queryRecord]查询数据库出现错误：" + sql);
            resultCode = 10;
            resultMsg = "查询数据库出现错误！" + e.getMessage();
        }
        queryDb.close();
        /*--------------------数据操作 结束--------------------*/
        /*--------------------返回数据 开始--------------------*/
        json.put("aaData",jsonList);
        json.put("aaFileName",jsonName);
        json.put("result_msg",resultMsg);															//如果发生错误就设置成"error"等
        json.put("result_code",resultCode);														//返回0表示正常，不等于0就表示有错误产生，错误代码
        /*--------------------返回数据 结束--------------------*/
    }

    private String createGetRecordSql(Data data) throws JSONException {
        String sql="select * from xm05_file_static";
        String id=data.getParam().has("id")?data.getParam().getString("id"):null;
        String userId=data.getParam().has("user_id")?data.getParam().getString("user_id"):null;
        String wantAttachment=data.getParam().has("want_attachment")?data.getParam().getString("want_attachment"):null;

        if(id!=null)
            sql=sql+" where id="+id;
        if(userId!=null)
        {
            String sqltemp ="select id from xm05_user_file where leaderID="+userId+" or id="+userId;
            sql = sql+" where create_user_id in ("+sqltemp+")";
        }
        if(wantAttachment!=null){
            //然后加上附件public_attachment，用子查询来实现从查询结果里关联，并获取对应的一条记录
            sql="select b.attachment_url,a.* from ("+sql+") a left join (select max(create_time),id,parent_id,attachment_url from xm05_file_attachment group by attachment_url) b on a.object_id=b.parent_id";
        }
        return sql;
    }



    public void getFileInfBySomeType(Data data, JSONObject json) throws JSONException, SQLException{
        /*--------------------获取变量 开始--------------------*/
        //排序要求
        String resultMsg = "ok";
        int resultCode = 0;
        List jsonList = new ArrayList();
        String timeFrom=(new SimpleDateFormat("yyyy-MM-dd 00:00:00")).format(new Date());
        String timeTo=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());

        /*--------------------获取变量 完毕--------------------*/
        /*--------------------数据操作 开始--------------------*/
        //排序要求
        String orderBy=data.getParam().has("order_by")?data.getParam().getString("order_by"):null;
        String groupBy=data.getParam().has("group_by")?data.getParam().getString("group_by"):null;

        project.weather.dao.DbRemote db = new project.weather.dao.DbRemote("yjykfsj2021");
        String sql="select type,count(*) as number from xm05_file_static";
        if(groupBy!=null){
            sql = sql+" group by "+groupBy;
        }
        if(orderBy!=null){
            sql = sql+" order by "+orderBy;
        }
        showDebug("[getFileInfBySomeType]构造的SQL语句是：" + sql);
        try {
            ResultSet rs = db.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
            int fieldCount = rsmd.getColumnCount();
            while (rs.next()) {
               HashMap map = new HashMap();
               map.put("type",rs.getString("type"));
               map.put("number",rs.getInt("number"));
               jsonList.add(map);
            }
            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
            showDebug("[getFileInfBySomeType]查询数据库出现错误：" + sql);
            resultCode = 10;
            resultMsg = "查询数据库出现错误！" + e.getMessage();
        }
        db.close();
        /*--------------------数据操作 结束--------------------*/
        /*--------------------返回数据 开始--------------------*/
        json.put("aaData",jsonList);
        json.put("result_msg",resultMsg);															//如果发生错误就设置成"error"等
        json.put("result_code",resultCode);														//返回0表示正常，不等于0就表示有错误产生，错误代码
        /*--------------------返回数据 结束--------------------*/
    }

    public void getFilePath(Data data, JSONObject json) throws JSONException, SQLException{
        /*--------------------获取变量 开始--------------------*/
        //排序要求
        String resultMsg = "ok";
        int resultCode = 0;
        String id=data.getParam().has("id")?data.getParam().getString("id"):null;
        /*--------------------获取变量 完毕--------------------*/
        /*--------------------数据操作 开始--------------------*/
        String fileRelativePath =null; // 文件相对路径
        DbRemote db = new DbRemote("yjykfsj2021");
        String sql="select object_id from xm05_file_static where id="+id;
        sql= "select attachment_url from xm05_file_attachment where parent_id=("+sql+")";
        showDebug("[getFilePath]构造的SQL语句是：" + sql);
        try {
            ResultSet rs = db.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
            while (rs.next()) {
                fileRelativePath=rs.getString("attachment_url");
            }
            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
            showDebug("[getFilePath]查询数据库出现错误：" + sql);
            resultCode = 10;
            resultMsg = "查询数据库出现错误！" + e.getMessage();
        }
        db.close();
        /*--------------------数据操作 结束--------------------*/
        /*--------------------返回数据 开始--------------------*/
        json.put("result_msg",resultMsg);															//如果发生错误就设置成"error"等
        json.put("result_code",resultCode);
        json.put("fileRelativePath",fileRelativePath);
        //返回0表示正常，不等于0就表示有错误产生，错误代码
        /*--------------------返回数据 结束--------------------*/
    }

    public void saveUploadFileRecord(Data data, JSONObject json) throws JSONException, SQLException {
        if(json.getJSONArray("files").length()>0){
            JSONArray array=(JSONArray)json.getJSONArray("files");
            for(int i=0;i<array.length();i++) {
                HashMap map = (HashMap)array.get(0);
                String downloadUrl= (String) map.get("download_url");
                String newFileName= (String) map.get("file_name");
                String filePath= (String) map.get("file_path");
                filePath=filePath.replaceAll("\\\\","\\\\\\\\");
                String creatorId=data.getParam().has("create_user_id")?data.getParam().getString("create_user_id"):"00000000";
                String creator=data.getParam().has("create_user")?data.getParam().getString("create_user"):"系统管理员";
                String objectId="ATTACH_"+(new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());				//传到前端的本次上传的唯一流水号
                String createTime=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
                String sql="insert into xm05_file_attachment(object_id,attachment_name,attachment_filename,attachment_url,creator_id,creator,create_time)";
                sql=sql+" values('"+objectId+"','"+newFileName+"','"+filePath+"','"+downloadUrl+"','"+creatorId+"','"+creator+"','"+createTime+"')";
                data.getParam().put("sql",sql);
                updateRecord(data,json);
                json.put("attachment_id",objectId);
            }
        }
    }
}

